package Set_and_Dict;

/*
根据字符出现频率排序
给定一个字符串 s ，根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
返回 已排序的字符串。如果有多个答案，返回其中任何一个。

示例 1:
输入: s = "tree"
输出: "eert"
解释: 'e'出现两次，'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外，"eetr"也是一个有效的答案。
示例 2:
输入: s = "cccaaa"
输出: "cccaaa"
解释: 'c'和'a'都出现三次。此外，"aaaccc"也是有效的答案。
注意"cacaca"是不正确的，因为相同的字母必须放在一起。
示例 3:
输入: s = "Aabb"
输出: "bbAa"
解释: 此外，"bbaA"也是一个有效的答案，但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。
作者：LeetCode
链接：https://leetcode.cn/leetbook/read/all-about-lockup-table/fc4ic/
 */

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

public class _24根据字符出现频率排序 {
    public static void main(String[] args) {

        String s = "Aabbc";

        String s1 = frequencySort(s);
        System.out.println(s1);
    }

    //HashMap 字典记录字母和对应频率 并记录最大值Max
    //逆序遍历 拼接输出
    public static String frequencySort(String s) {
        HashMap<Character,Integer> dict = new HashMap<Character,Integer>();
        StringBuilder res = new StringBuilder();
        int max = 0;
        for (char c : s.toCharArray()) {
            dict.put(c,dict.getOrDefault(c,0) + 1);
            max = Math.max(max,dict.get(c));
        }
        Set<Map.Entry<Character, Integer>> entries = dict.entrySet();
        for (int i = max; i >= 1; i--) {
            for (Map.Entry<Character, Integer> entry : entries) {
                if (entry.getValue() == i) {
                    for (int j = 0; j < i; j++) {
                        res.append(entry.getKey());
                    }
                }
            }
        }
        return res.toString();
    }
}
